package model

import (
	"time"

	"gorm.io/gorm"
)

// Training 培训模型
// 用于管理公司的培训计划，包括培训内容、时间安排、地点和讲师等信息
// 支持多种培训类型（入职培训、技能培训、管理培训），并通过many2many关系管理参训人员
type Training struct {
	ID        uint           `gorm:"primarykey" json:"id"` // 主键ID
	CreatedAt time.Time      `json:"created_at"`           // 创建时间
	UpdatedAt time.Time      `json:"updated_at"`           // 更新时间
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`       // 软删除时间

	Title       string `gorm:"size:100;not null" json:"title"` // 培训标题，最大长度100
	Description string `gorm:"size:2000" json:"description"`   // 培训描述，最大长度2000

	Type      string    `gorm:"size:20;not null;default:'onboarding'" json:"type"` // 培训类型：onboarding-入职培训，skill-技能培训，management-管理培训
	StartTime time.Time `gorm:"not null" json:"start_time"`                        // 开始时间，记录培训开始时间
	EndTime   time.Time `gorm:"not null" json:"end_time"`                          // 结束时间，记录培训结束时间
	Location  string    `gorm:"size:200" json:"location"`                          // 培训地点，最大长度200
	Trainer   string    `gorm:"size:50" json:"trainer"`                            // 培训讲师姓名，最大长度50
	MaxEnroll int       `gorm:"not null;default:50" json:"max_enroll"`             // 最大报名人数，默认50
	Status    string    `gorm:"size:20;not null;default:'pending'" json:"status"`  // 状态：pending-未开始，enrolling-报名中，ongoing-进行中，completed-已结束

}

// TrainingRecord 培训记录模型
// 用于记录用户参加培训的情况，包括报名时间、完成进度等
type TrainingRecord struct {
	ID        uint           `gorm:"primarykey" json:"id"`
	CreatedAt time.Time      `json:"created_at"`
	UpdatedAt time.Time      `json:"updated_at"`
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`

	TrainingID uint      `gorm:"not null" json:"training_id"`
	UserID     uint      `gorm:"not null" json:"user_id"`
	EnrolledAt time.Time `json:"enrolled_at"`                                       // 报名时间
	Status     string    `gorm:"size:20;not null;default:'enrolled'" json:"status"` // 状态：enrolled-已报名，completed-已完成，dropped-已退出
	Completion float32   `gorm:"not null;default:0" json:"completion"`              // 完成进度，0-100的浮点数

	Training *Training `gorm:"foreignKey:TrainingID" json:"training"` // 关联的培训信息
	User     *User     `gorm:"foreignKey:UserID" json:"user"`         // 关联的用户信息
}

// TrainingCourse 培训课程模型
// 用于管理培训课程的基本信息，包括课程内容、时长、顺序等
// 每个培训课程都属于一个特定的培训计划，通过TrainingID关联到Training模型
type TrainingCourse struct {
	ID        uint           `gorm:"primarykey" json:"id"` // 主键ID
	CreatedAt time.Time      `json:"created_at"`           // 创建时间
	UpdatedAt time.Time      `json:"updated_at"`           // 更新时间
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`       // 软删除时间

	TrainingID uint   `gorm:"not null" json:"training_id"`    // 所属培训ID，关联培训计划
	Title      string `gorm:"size:200;not null" json:"title"` // 课程标题，最大长度200
	Duration   int    `gorm:"not null" json:"duration"`       // 课程时长，单位为分钟
	VideoURL   string `gorm:"size:500" json:"video_url"`      // 视频资源URL，最大长度500

	Training *Training `gorm:"foreignKey:TrainingID" json:"training"` // 关联培训计划信息
}

// TrainingAttendance 培训考勤记录模型
// 用于记录用户参加具体培训课程的考勤情况，包括签到时间和考勤状态
// 通过RecordID和CourseID分别关联到培训记录和课程，实现对培训参与度的精确管理
type TrainingAttendance struct {
	UserID    uint           `gorm:"primaryKey" json:"user_id"`   // 用户ID，联合主键
	CourseID  uint           `gorm:"primaryKey" json:"course_id"` // 课程ID，联合主键
	CreatedAt time.Time      `json:"created_at"`                  // 创建时间
	UpdatedAt time.Time      `json:"updated_at"`                  // 更新时间
	DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`              // 软删除时间

	CheckTime time.Time `gorm:"not null" json:"check_time"`               // 签到时间，记录用户签到时间
	IsPresent bool      `gorm:"not null;default:false" json:"is_present"` // 是否出席，true-出席，false-缺席

	Course *TrainingCourse `gorm:"foreignKey:CourseID" json:"course"` // 关联课程信息
}
